home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / Libraries / DCLAP 6d / dclap6d / Drtf / DRTFHandler.cpp < prev    next >
Text File  |  1996-07-05  |  45KB  |  2,527 lines

  1. // DRTFHandler.cpp
  2. // d.g.gilbert
  3.  
  4.  
  5. #include "Dvibrant.h"
  6. #include "DFile.h"
  7. #include "DRTFHandler.h"
  8. #include "DRichProcess.h"
  9. #include "DRichViewNu.h"
  10. #include "DRichMoreStyle.h"
  11.  
  12.  
  13.  
  14. # define    rtfInternal
  15. #define STDARG
  16. # include    "rtf.h"
  17. # undef        rtfInternal
  18.  
  19.  
  20.  
  21. enum {
  22.     RTFBreakInData = -6,        // mark end of data buffer, but not EOF 
  23.     chPictTag = 26,
  24.     kWaitTables = DRichHandler::kAtEnd + 1
  25.      };
  26.      
  27.      
  28. class DRTFprocess : public DRichprocess
  29. {
  30. public:
  31.     static void RTFWriterInit(char* mapfilepath, char* charMapFile, char* symMapFile);
  32.     static void RTFWriterEnd();
  33.  
  34.     DRTFprocess( DFile* itsFile, DRichView* itsDoc, Nlm_MonitorPtr progress);
  35.     virtual ~DRTFprocess();
  36.  
  37.     short GetToken(); // temp override
  38.     void  RouteToken(); // temp override
  39.     void  SetToken();
  40.     
  41.     void    handleTextClass();
  42.     void    handleControlClass(); 
  43.     void  handleGroupClass();
  44.  
  45. protected:
  46.     char*     fPict;
  47.     ulong     fPictMax, fPictSize;
  48.     long         fPicNibble;
  49.     short     fLastNibble, fPictKind;
  50.     Boolean    fInPic, fGlobalsInUse;
  51.     
  52.     void  PutPicChar(short c);
  53.     void  PutStdChar(short stdCode);
  54.  
  55.   void  Destination();
  56.   void  SpecialChar();
  57.   void  DocAttr();
  58.   void  SectAttr();
  59.   void  TblAttr();
  60.   void  ParAttr();
  61.   void  CharAttr();
  62.   void  PictAttr();
  63.   void  BookmarkAttr();
  64.   void  NeXTGrAttr();
  65.   void  FieldAttr();
  66.   void  TOCAttr();
  67.   void  PosAttr();
  68.   void  ObjAttr();
  69.   void  FNoteAttr();
  70.   void  KeyCodeAttr();
  71.   void  ACharAttr();
  72.   void  FontAttr();
  73.   void  FileAttr();
  74.   void  FileSource();
  75.   void  DrawAttr();
  76.   void  IndexAttr();
  77.   void  SelectLanguage();
  78. };
  79.  
  80.  
  81.  
  82. //class DRTFsetup
  83.  
  84. static char* kRTFgenmap = "show-gen";
  85. static char* kRTFsymmap = "show-sym";
  86. static char* kRTFfolder = "rtf-maps";
  87.  
  88. class DRTFsetup  
  89. {
  90. public:
  91.     DRTFsetup();
  92.     ~DRTFsetup();
  93. };
  94.  
  95. static DRTFsetup* gRTFsetup = NULL;
  96.  
  97. #if 0
  98. static DRTFsetup  rtfSetup; // initialize here
  99. #endif
  100.  
  101. DRTFsetup::DRTFsetup()
  102. {
  103.     char *progpath;
  104.     
  105.     progpath= (char*) DFileManager::GetProgramPath();  
  106.     progpath= (char*) DFileManager::PathOnlyFromPath( progpath);
  107.     progpath= (char*) DFileManager::BuildPath( progpath, kRTFfolder, NULL);
  108.     // progpath so far is all stored in DFileManager static var
  109.     // progpath= StrDup( progpath);
  110.     DRTFprocess::RTFWriterInit(progpath, kRTFgenmap, kRTFsymmap);        // once-only writer initialization 
  111.     //MemFree(progpath);
  112. }
  113.  
  114. DRTFsetup::~DRTFsetup()
  115. {
  116.     DRTFprocess::RTFWriterEnd();            // once-only writer cleanup 
  117. }
  118.  
  119.  
  120.  
  121.  
  122. //class  DRTFHandler
  123.  
  124. DRTFHandler::DRTFHandler(DRichView* itsDoc, DFile* savefile) :
  125.     DRichHandler( itsDoc, savefile)
  126. {
  127.     fFormatName = "RTF";
  128.     fMinDataToProcess= 128; // no fixed min, need to look at data...
  129.   if (gRTFsetup==NULL) gRTFsetup= new DRTFsetup();
  130. }
  131.  
  132. char* DRTFHandler::IsRich(char* buf, ulong buflen)
  133. {
  134.     if (buflen==0) buflen= strlen(buf);
  135.     ulong len = buflen;
  136.     while (len>3) {
  137.         char* cp= (char*) MemChr(buf,'{',len);
  138.         if (!cp)
  139.             return NULL;        
  140.         else if (cp[1] == '\\' && cp[2] == 'r' && cp[3] == 't' && cp[4] == 'f') 
  141.             return cp;
  142.         else {
  143.             cp++;
  144.             len -= (cp - buf);
  145.             buf = cp;
  146.             }
  147.         }
  148.     return NULL;
  149. }
  150.  
  151.  
  152. DRichprocess* DRTFHandler::NewProcessor( DFile* itsFile, Nlm_MonitorPtr progress)
  153. {
  154.         fProcessor = new DRTFprocess( itsFile, fDoc, progress);
  155.         return fProcessor;
  156. }
  157.  
  158. Boolean DRTFHandler::ProcessData( char* cbeg, char* cend, Boolean endOfData, 
  159.                     ulong& dataRemaining) 
  160. {
  161.  
  162.     char  * cp;
  163.     //char csave = 0;  
  164.     //ulong clen;
  165.  
  166.     //return DRichHandler::ProcessData( cbeg, cend, endOfData, dataRemaining);        
  167.  
  168.     
  169.         // RTFRouteToken() is failing in stylesheets because it 
  170.         // calls RTFGetToken when we have no more !!!...
  171.         // ReadStyleSheet, ReadColorTbl, ReadFontTbl all call RTFGetToken !!!
  172.         // need to patch this to parse the RTF for {\fonttbl...}{\colortbl...}{\stylesheet...} 
  173.         // and read until they are all collected !? (at top of \rtf file)
  174.         
  175.     if (fProcessStage == kAtStart && !endOfData) {  
  176.         // patch to wait for {\fonttbl...}{\colortbl...}{\stylesheet...}
  177.         // assume \stylesheet always last ?!
  178.         Nlm_Uint4    foundat = 0;
  179.         Boolean     found = Nlm_StrngPos(cbeg, "{\\stylesheet", 0, false, &foundat);
  180.         if (!found) 
  181.             return false; // wait for more data ...
  182.         else {
  183.             Boolean notdone= true;
  184.             short level= 1;
  185.             cp= cbeg + foundat + 12;
  186.             while (cp < cend && notdone) {
  187.                 cp++;
  188.                 if (*cp == '{') level++;
  189.                 else if (*cp == '}') { level--; if (level<0) notdone= false; }
  190.                 }    
  191.             if (notdone) return false; // wait for more data ...
  192.             }
  193.         }
  194.          
  195.     cp= cend; 
  196.     
  197.     if (!endOfData) while (cp - cbeg > fLastScanto && *cp != '}') cp--;
  198.     if (cp - cbeg <= fLastScanto) {
  199.         fLastScanto= cend - cbeg;  
  200.         if (!endOfData) return false; // !??! don't process unterminated rtf block
  201.         else cp= cend; 
  202.         }
  203.  
  204.     if (*cp) cp++;
  205.     fcsave= *cp; 
  206.     *cp= 0;
  207.     fclen= cp - cbeg; // ?? +1
  208.     
  209.     if (fclen && fDocFile) {
  210.         //fclen= cp - cbeg;
  211.         if (cbeg[fclen-1] == 0) fclen--;
  212.         fDocFile->WriteData( cbeg, fclen);
  213.         }    
  214.  
  215.     return this->ProcessData2( cp, cbeg, cend, endOfData, dataRemaining);
  216. }
  217.  
  218.  
  219.  
  220.  
  221.  
  222.  
  223.  
  224. //class  DRTFprocess
  225.  
  226. //static char        gGenCharMap[rtfSC_MaxChar];
  227. //static char        gSymCharMap[rtfSC_MaxChar];
  228. //static char * gOutMap = gGenCharMap;
  229. static char    * gMapfilePath = NULL;
  230.  
  231. // !! DAMN, we can't deal with this kind of global && multiple processors
  232.  
  233. DRTFprocess* gRTFprocess = NULL;
  234.  
  235.  
  236. extern "C" void rtfHandleUnknownClass()
  237. {
  238.     gRTFprocess->SetToken();
  239.     gRTFprocess->handleUnknownClass();
  240. }
  241.  
  242. extern "C" void rtfHandleTextClass()
  243. {
  244. #if 0 //x
  245.     gRTFprocess->SetToken();
  246. #else
  247.     // inline for speed here...
  248.     gRTFprocess->fClass= rtfClass; 
  249.     gRTFprocess->fMajor= rtfMajor;
  250.     gRTFprocess->fMinor= rtfMinor;
  251.     gRTFprocess->fParam= rtfParam;
  252. #endif
  253.  
  254.     gRTFprocess->handleTextClass();
  255. }
  256.  
  257. extern "C" void rtfHandleControlClass()
  258. {
  259.     gRTFprocess->SetToken();
  260.     gRTFprocess->handleControlClass();
  261. }
  262.  
  263. extern "C" void rtfHandleGroupClass()
  264. {
  265.     gRTFprocess->SetToken();
  266.     gRTFprocess->handleGroupClass();
  267. }
  268.  
  269.  
  270. extern "C" short rtfGetOneChar()
  271. {
  272. #if 0 //x
  273.             // this is slower than we like -- this is called a lot
  274.     return gRTFprocess->GetOneChar();
  275. #else
  276.     short    c = EOF;
  277.  
  278.     if (gRTFprocess->fDataBuffer) {
  279.         c= *gRTFprocess->fDataBuffer;
  280.         if (gRTFprocess->fDataSize) {    // for counted data
  281.             gRTFprocess->fDataSize--;
  282.             gRTFprocess->fDataBuffer++;
  283.             if (!gRTFprocess->fDataSize) gRTFprocess->fDataBuffer= NULL; //  so EOF next time
  284.             }
  285.         else if (c) gRTFprocess->fDataBuffer++; // for null-term data
  286.         else if (!gRTFprocess->fEndOfData) c= DRichprocess::tokBreakInData;
  287.         else c= EOF;
  288.         }
  289.     else if (gRTFprocess->fDataFile) 
  290.         c = fgetc( gRTFprocess->fDataFile->fFile);
  291.     return (c);
  292. #endif
  293. }
  294.  
  295.  
  296.  
  297. enum {
  298.     kMaxstops = 30
  299.     };
  300.  
  301.  
  302. DRTFprocess::DRTFprocess( DFile* itsFile, DRichView* itsDoc, Nlm_MonitorPtr progress) :
  303.     DRichprocess( itsFile, itsDoc, progress),
  304.     fPict(NULL), fPictKind(0), fInPic(false)
  305. {     
  306.     fPictMax= 0;
  307.     fPictSize= 0;
  308.     fPicNibble= 0;
  309.     fLastNibble= 0;
  310.     fGlobalsInUse= false;
  311.  
  312. #if 1
  313.     // damn, this is a mess    
  314.     fParaFmt.tabstops= (short*) MemNew( kMaxstops * sizeof(short));
  315.     fParaFmt.tabkinds= (char*) MemNew( kMaxstops * sizeof(char));
  316.     fOldParaFmt= fParaFmt;
  317.     fDefParaFmt= fParaFmt;
  318. #endif
  319.     
  320.         // !! DAMN, we can't deal with this kind of global && multiple processors
  321.     if (gRTFprocess) {
  322.         Nlm_Message( MSG_OK, "%s", "RTFprocess globals in use by other processor"); 
  323.         fGlobalsInUse= true;
  324.         return;
  325.         }
  326.     else 
  327.         gRTFprocess= this; 
  328.     
  329.     fOutMap= DRichprocess::gGenCharMap;
  330.  
  331.     RTFInit();
  332.     
  333.     /* install class callbacks */
  334.     RTFSetClassCallback(rtfUnknown, rtfHandleUnknownClass);
  335.     RTFSetClassCallback(rtfText, rtfHandleTextClass);
  336.     RTFSetClassCallback(rtfControl, rtfHandleControlClass);
  337.     RTFSetClassCallback(rtfGroup, rtfHandleGroupClass); 
  338. }
  339.  
  340. DRTFprocess::~DRTFprocess()
  341. {
  342.     Nlm_MemFree(fPict);
  343.     gRTFprocess= NULL;
  344. }
  345.  
  346.  
  347. void DRTFprocess::SetToken()  // temp override
  348. {
  349.         // damn -- some calls to RTFrouteToken bypass our GetToken @!
  350.     fClass= rtfClass; 
  351.     fMajor= rtfMajor;
  352.     fMinor= rtfMinor;
  353.     fParam= rtfParam;
  354. }
  355.  
  356. short DRTFprocess::GetToken()  // temp override
  357. {
  358.     short tok;
  359.     if (fGlobalsInUse) tok= tokEOF;
  360.     else tok= RTFGetToken();
  361.         // DAMN must convert rtftoken vals to new tok vals
  362.     if (tok == rtfEOF) tok= tokEOF;
  363.     
  364.     fClass= tok;
  365.     fMajor= rtfMajor;
  366.     fMinor= rtfMinor;
  367.     fParam= rtfParam;
  368.     return tok;
  369. }
  370.  
  371. void  DRTFprocess::RouteToken() // temp override
  372. {
  373.     RTFRouteToken();
  374. }
  375.  
  376.     
  377. void DRTFprocess::PutPicChar(short c)
  378. {
  379.     if (fPictSize >= fPictMax) {
  380.         fPictMax = fPictSize + 1024;
  381.         if (!fPict) fPict= (char*) Nlm_MemNew(fPictMax+1);
  382.         else fPict= (char*) Nlm_MemMore( fPict, fPictMax+1);
  383.         }
  384.     fPict[fPictSize++]= (char) c;
  385. }
  386.  
  387.  
  388.  
  389. void DRTFprocess::PutStdChar(short stdCode)
  390. {
  391. #if 1
  392.     DRichprocess::PutStdChar(stdCode);
  393. #else
  394.     int och = gOutMap[stdCode];
  395.     if (och == rtfSC_nothing)    {  /* no output sequence in map */
  396.         char    buf[rtfBufSiz];
  397.         sprintf(buf, "{{%s}}", RTFStdCharName (stdCode));
  398.         PutLitStr(buf);
  399.         }
  400.     else {
  401.         PutLitChar(och);
  402.         }
  403. #endif
  404. }
  405.  
  406.  
  407.  
  408.  
  409.  
  410. #define    defaultCharMapFile    "show-gen"  /* should be calling parameter to WriterInit() ? */
  411. #define    defaultSymMapFile        "show-sym"  /* should be calling parameter to WriterInit() ? */
  412. #define defaultRTFfolder         "rtf-maps" 
  413.  
  414.  
  415.  
  416. extern "C" FILE* defaultOpenLibfileProc(char* file, char* mode)
  417. {
  418.     char *pathname, namebuf[512];
  419.     StrNCpy(namebuf, gMapfilePath, 500);
  420.     pathname= Nlm_FileBuildPath(namebuf, NULL, file);
  421.     return Nlm_FileOpen( pathname, mode);
  422. }
  423.  
  424.  
  425.  
  426.  
  427.  
  428.  
  429. void DRTFprocess::RTFWriterInit(char* mapfilepath, char* charMapFile, char* symMapFile)
  430. {    
  431.     /* perform once-only initializations here */
  432.  
  433.     if (mapfilepath)    
  434.         gMapfilePath= StrDup(mapfilepath);
  435.     else {
  436.         char pathname[512], *progpath;
  437.         char* nameonly;
  438.         long len;
  439.         
  440.         progpath= (char*) DFileManager::GetProgramPath();  
  441.         progpath= (char*) DFileManager::PathOnlyFromPath( progpath);
  442.         mapfilepath= (char*) DFileManager::BuildPath( progpath, kRTFfolder, NULL);
  443.  
  444.         gMapfilePath= StrDup(mapfilepath);
  445.         }
  446.  
  447.     /* optionally: RTFSetReadHook( rtfReaderProgressProc); */
  448.     /*  ^^^ if we want to show progress bar or further handle token */
  449.     
  450.     RTFSetOpenLibFileProc( defaultOpenLibfileProc);
  451.  
  452.     //DRichprocess::gGenCharMap= DRichprocess::ReadOutputMap("gen");
  453.     //DRichprocess::gSymCharMap= DRichprocess::ReadOutputMap("sym");
  454.   //gOutMap= gGenCharMap;
  455.     
  456.         
  457. #if 0
  458.     /* one time generate charsets in .h format */
  459.     RTFReadCharSetMap ("mac-gen", rtfCSGeneral);
  460.     RTFReadCharSetMap ("mac-sym", rtfCSSymbol);        // superset of ansi-sym !
  461.     RTFReadCharSetMap ("mwin-gen", rtfCSGeneral); // superset of ansi-gen 
  462.     RTFReadCharSetMap ("pc-gen", rtfCSGeneral);
  463.     RTFReadCharSetMap ("pc-sym", rtfCSSymbol);        // == ansi-sym
  464.     RTFReadCharSetMap ("pca-gen", rtfCSGeneral);
  465.     RTFReadCharSetMap ("pca-sym", rtfCSSymbol);        // == ansi-sym
  466.     RTFReadCharSetMap ("ansi-gen", rtfCSGeneral);
  467.     RTFReadCharSetMap ("ansi-sym", rtfCSSymbol);
  468.     //RTFReadCharSetMap ("show-gen", rtfCSGeneral);
  469.     //RTFReadCharSetMap ("show-sym", rtfCSSymbol);
  470. #endif
  471.  
  472. }
  473.  
  474.  
  475.  
  476. void DRTFprocess::RTFWriterEnd()
  477. {
  478.     Nlm_MemFree( gMapfilePath);
  479. }
  480.  
  481.  
  482.  
  483.  
  484.  
  485.  
  486. void DRTFprocess::handleTextClass()
  487. {
  488.     if (fInPic) {
  489.             // this is encoded pic data, need opts for binary pic data !
  490.         if (fPicNibble & 1) {
  491.             short abyte = RTFCharToHex(fLastNibble) * 16 + RTFCharToHex(fMajor);
  492.             PutPicChar( abyte);
  493.             }
  494.         else  
  495.             fLastNibble= fMajor;
  496.         fPicNibble++;
  497.         }
  498.         
  499.     else {
  500.         if (IsNewStyle()) StoreStyle(fOldStyleRec.style, FALSE); 
  501.         
  502.         if (fMinor != rtfSC_nothing)
  503.             PutStdChar(fMinor); 
  504.         else {
  505.             char    buf[rtfBufSiz];
  506.             if (fMajor < 128)    /* in ASCII range */
  507.                 sprintf(buf, "[[%c]]", fMajor);
  508.             else
  509.                 sprintf(buf, "[[\\'%02x]]", fMajor);
  510.             PutLitStr(buf);
  511.             }
  512.         }
  513. }
  514.  
  515.  
  516. void DRTFprocess::handleGroupClass()
  517. {
  518.  
  519.     switch (fMajor) {
  520.     
  521.     case rtfBeginGroup:
  522.         /* push gStyleRec .. */
  523.         if (fStyleStackSize<kMaxStyleStack) fStyleStack[fStyleStackSize++]= fStyleRec;
  524.         break;
  525.         
  526.     case rtfEndGroup:
  527.     
  528.         if (fInPic) {
  529.             /* end of pic data here... */
  530.  
  531.             fPict[fPictSize]= 0;
  532.             fStyleRec.style.font= fFont; /* !?!? */
  533.             fStyleRec.style.ispict= TRUE;
  534. #if 1
  535.             fStyleRec.style.fObject= 
  536.                     new DPictStyle( fPictKind, fPict, fPictSize, false); 
  537. #else
  538.             fStyleRec.style.picdata= (char*) MemDup(fPict, fPictSize); 
  539.             fStyleRec.style.picsize= fPictSize;
  540.             fStyleRec.style.pickind= fPictKind;
  541. #endif
  542.  
  543.             PutLitChar(' '); // (chPictTag); /* put a space for some real text ? */
  544.             StoreStyle(fStyleRec.style, TRUE);
  545.  
  546.             fPictSize= 0;
  547.             fPicNibble= 0;
  548.             fLastNibble= 0;
  549. #if 1
  550.             fStyleRec.style.fObject= NULL;
  551. #else
  552.             fStyleRec.style.picdata= 0;
  553.             fStyleRec.style.picsize= 0;
  554.             fStyleRec.style.pickind= 0;
  555. #endif
  556.             fStyleRec.style.ispict= FALSE;
  557.             fStyleRec.style.pixwidth= 0; 
  558.             fStyleRec.style.pixheight= 0; 
  559.             fOldStyleRec= fStyleRec;
  560.             fOldStyleRec.fontname= NULL; /* ?? force new style ? */
  561.             fInPic= FALSE;
  562.             StoreStyle(fStyleRec.style, TRUE);
  563.             PutLitChar(' '); /* put a space for some real text ? */
  564.             }
  565.             
  566.         if (fStyleStackSize>0) fStyleRec= fStyleStack[--fStyleStackSize];
  567.             
  568.         if (StrNICmp (fStyleRec.fontname, "Symbol", 6) == 0) {
  569.             RTFSetCharSet(rtfCSSymbol);
  570.             if (fOutMap != gSymCharMap) fOutMap= gSymCharMap;
  571.             }
  572.         else {
  573.             RTFSetCharSet(rtfCSGeneral);
  574.             if (fOutMap != gGenCharMap) fOutMap= gGenCharMap;
  575.             }
  576.         NewStyle();
  577.         break;    
  578.         }
  579.  
  580. }
  581.  
  582.  
  583. void DRTFprocess::handleControlClass()
  584. {
  585.     switch (fMajor) {
  586.  
  587.     case rtfVersion:
  588.         break;
  589.     case rtfDefFont:
  590.         /*
  591.          * fParam contains the default font number.  Beware
  592.          * that there is no guarantee that this font will actually
  593.          * be listed in the font table!
  594.          */
  595.         break;
  596.     case rtfCharSet:
  597.         /* handled by reader */
  598.         break;
  599.     case rtfDestination:
  600.         Destination();
  601.         break;
  602.     case rtfFontFamily:
  603.         /* only occurs within font table - can ignore */
  604.         break;
  605.     case rtfColorName:
  606.         /* only occurs within color table - can ignore */
  607.         break;
  608.     case rtfSpecialChar:
  609.         SpecialChar();
  610.         break;
  611.     case rtfStyleAttr:
  612.         /* only occurs within stylesheet - can ignore */
  613.         break;
  614.     case rtfDocAttr:
  615.         DocAttr();
  616.         break;
  617.     case rtfSectAttr:
  618.         SectAttr();
  619.         break;
  620.     case rtfTblAttr:
  621.         TblAttr();
  622.         break;
  623.     case rtfParAttr:
  624.         ParAttr();
  625.         break;
  626.     case rtfCharAttr:
  627.         CharAttr();
  628.         break;
  629.     case rtfPictAttr:
  630.         PictAttr();
  631.         break;
  632.     case rtfBookmarkAttr:
  633.         BookmarkAttr();
  634.         break;
  635.     case rtfNeXTGrAttr:
  636.         NeXTGrAttr();
  637.         break;
  638.     case rtfFieldAttr:
  639.         FieldAttr();
  640.         break;
  641.     case rtfTOCAttr:
  642.         TOCAttr();
  643.         break;
  644.     case rtfPosAttr:
  645.         PosAttr();
  646.         break;
  647.     case rtfObjAttr:
  648.         ObjAttr();
  649.         break;
  650.     case rtfFNoteAttr:
  651.         FNoteAttr();
  652.         break;
  653.     case rtfKeyCodeAttr:
  654.         KeyCodeAttr();
  655.         break;
  656.     case rtfACharAttr:
  657.         ACharAttr();
  658.         break;
  659.     case rtfFontAttr:
  660.         FontAttr();
  661.         break;
  662.     case rtfFileAttr:
  663.         FileAttr();
  664.         break;
  665.     case rtfFileSource:
  666.         FileSource();
  667.         break;
  668.     case rtfDrawAttr:
  669.         DrawAttr();
  670.         break;
  671.     case rtfIndexAttr:
  672.         IndexAttr();
  673.         break;
  674.     }
  675.  
  676. }
  677.  
  678.  
  679. /*
  680.  * Control class major number handlers.  Each one switches on
  681.  * the minor numbers that occur within the major number.
  682.  */
  683. /*
  684.  * This function notices destinations that should be ignored
  685.  * and skips to their ends.  This keeps, for instance, picture
  686.  * data from being considered as plain text.
  687.  */
  688.  
  689.  
  690. void DRTFprocess::Destination()
  691. {
  692.     switch (fMinor)
  693.     {
  694.     
  695.     case rtfFontTbl:
  696.         /* will never occur because of default destination reader */
  697.         break;
  698.     case rtfFontAltName:
  699.         break;
  700.     case rtfEmbeddedFont:
  701.         break;
  702.     case rtfFontFile:
  703.         break;
  704.     case rtfFileTbl:
  705.         break;
  706.     case rtfFileInfo:
  707.         break;
  708.     case rtfColorTbl:
  709.         /* will never occur because of default destination reader */
  710.         break;
  711.     case rtfStyleSheet:
  712.         /* will never occur because of default destination reader */
  713.         break;
  714.     case rtfKeyCode:
  715.         /*
  716.          * Currently will never occur because the stylesheet
  717.          * reader eats the keycode group.
  718.          */
  719.         break;
  720.     case rtfRevisionTbl:
  721.         break;
  722.     case rtfInfo:
  723.         RTFSkipGroup();
  724.         break;
  725.     case rtfITitle:
  726.         RTFSkipGroup();
  727.         break;
  728.     case rtfISubject:
  729.         RTFSkipGroup();
  730.         break;
  731.     case rtfIAuthor:
  732.         break;
  733.         RTFSkipGroup();
  734.     case rtfIOperator:
  735.         RTFSkipGroup();
  736.         break;
  737.     case rtfIKeywords:
  738.         RTFSkipGroup();
  739.         break;
  740.     case rtfIComment:
  741.         RTFSkipGroup();
  742.         break;
  743.     case rtfIVersion:
  744.         RTFSkipGroup();
  745.         break;
  746.     case rtfIDoccomm:
  747.         RTFSkipGroup();
  748.         break;
  749.     case rtfIVerscomm:
  750.         break;
  751.     case rtfNextFile:
  752.         RTFSkipGroup();    /* dgg */
  753.         break;
  754.     case rtfTemplate:
  755.         RTFSkipGroup();    /* dgg */
  756.         break;
  757.     case rtfFNSep:
  758.         break;
  759.     case rtfFNContSep:
  760.         RTFSkipGroup();
  761.         break;
  762.     case rtfFNContNotice:
  763.         RTFSkipGroup();
  764.         break;
  765.     case rtfENSep:
  766.         break;
  767.     case rtfENContSep:
  768.         break;
  769.     case rtfENContNotice:
  770.         break;
  771.     case rtfPageNumLevel:
  772.         break;
  773.     case rtfParNumLevelStyle:
  774.         break;
  775.         
  776.     case rtfHeader:
  777.         break;
  778.     case rtfFooter:
  779.         break;
  780.     case rtfHeaderLeft:
  781.         break;
  782.     case rtfHeaderRight:
  783.         break;
  784.     case rtfHeaderFirst:
  785.         break;
  786.     case rtfFooterLeft:
  787.         break;
  788.     case rtfFooterRight:
  789.         break;
  790.     case rtfFooterFirst:
  791.         break;
  792.         
  793.     case rtfParNumText:
  794.         break;
  795.     case rtfParNumbering:
  796.         break;
  797.     case rtfParNumTextAfter:
  798.         break;
  799.     case rtfParNumTextBefore:
  800.         break;
  801.     case rtfBookmarkStart:
  802.         break;
  803.     case rtfBookmarkEnd:
  804.         break;
  805.         
  806.     case rtfPict:
  807.         /* at first, parse group and pull out pict size: \pict\macpict\picw34\pich21\picscaled 
  808.         /* RTFSkipGroup();   /* !! fix this later to process pict */
  809.         /* NewParagraph();  ?? */
  810.         break;
  811.         
  812.     case rtfObject:
  813.         break;
  814.     case rtfObjClass:
  815.         break;
  816.     case rtfObjName:
  817.         break;
  818.     case rtfObjTime:
  819.         break;
  820.     case rtfObjData:
  821.         break;
  822.     case rtfObjAlias:
  823.         break;
  824.     case rtfObjSection:
  825.         break;
  826.     case rtfObjResult:
  827.         break;
  828.     case rtfObjItem:
  829.         break;
  830.     case rtfObjTopic:
  831.         break;
  832.     case rtfDrawObject:
  833.         break;
  834.     case rtfFootnote:
  835.         break;
  836.     case rtfAnnotRefStart:
  837.         break;
  838.     case rtfAnnotRefEnd:
  839.         break;
  840.     case rtfAnnotID:
  841.         break;
  842.     case rtfAnnotAuthor:
  843.         break;
  844.     case rtfAnnotation:
  845.         break;
  846.     case rtfAnnotRef:
  847.         break;
  848.     case rtfAnnotTime:
  849.         break;
  850.     case rtfAnnotIcon:
  851.         break;
  852.         
  853.     case rtfField:
  854.         break;
  855.     case rtfFieldInst:
  856.         RTFSkipGroup(); /* dgg, 27may94 */
  857.         break;
  858.     case rtfFieldResult:
  859.         /* this text should be displayed... */
  860.         break;
  861.     case rtfDataField:
  862.         RTFSkipGroup(); /* ?? binary data?? dgg, 27may94 */
  863.         break;
  864.         
  865.     case rtfIndex:
  866.         break;
  867.     case rtfIndexText:
  868.         break;
  869.     case rtfIndexRange:
  870.         RTFSkipGroup();
  871.         break;
  872.     case rtfTOC:
  873.         break;
  874.     case rtfNeXTGraphic:
  875.         break;
  876.     }
  877. }
  878.  
  879.  
  880. void DRTFprocess::SpecialChar()
  881. {
  882.     switch (fMinor)
  883.     {
  884.     case rtfIIntVersion:
  885.         break;
  886.     case rtfICreateTime:
  887.         break;
  888.     case rtfIRevisionTime:
  889.         break;
  890.     case rtfIPrintTime:
  891.         break;
  892.     case rtfIBackupTime:
  893.         break;
  894.     case rtfIEditTime:
  895.         break;
  896.     case rtfIYear:
  897.         break;
  898.     case rtfIMonth:
  899.         break;
  900.     case rtfIDay:
  901.         break;
  902.     case rtfIHour:
  903.         break;
  904.     case rtfIMinute:
  905.         break;
  906.     case rtfISecond:
  907.         break;
  908.     case rtfINPages:
  909.         break;
  910.     case rtfINWords:
  911.         break;
  912.     case rtfINChars:
  913.         break;
  914.     case rtfIIntID:
  915.         break;
  916.     case rtfCurHeadDate:
  917.         break;
  918.     case rtfCurHeadDateLong:
  919.         break;
  920.     case rtfCurHeadDateAbbrev:
  921.         break;
  922.     case rtfCurHeadTime:
  923.         break;
  924.     case rtfCurHeadPage:
  925.         break;
  926.     case rtfSectNum:
  927.         break;
  928.     case rtfCurFNote:
  929.         break;
  930.     case rtfCurAnnotRef:
  931.         break;
  932.     case rtfFNoteSep:
  933.         break;
  934.     case rtfFNoteCont:
  935.         break;
  936.     case rtfCell:
  937.         PutStdCharWithStyle (rtfSC_space);    /* make sure cells are separated */
  938.         break;
  939.         
  940.     case rtfRow:
  941.         PutLitCharWithStyle ('\n');
  942.         break;
  943.     case rtfPar:
  944.         PutLitCharWithStyle ('\n');
  945.         NewParagraph();
  946.         break;
  947.     case rtfSect:
  948.         PutLitCharWithStyle ('\n');
  949.         NewParagraph(); /* ?? */
  950.         break;
  951.     case rtfPage:
  952.         PutLitCharWithStyle ('\n');
  953.         fParaFmt.newPage= TRUE; /* ?? ??*/
  954.         NewParagraph();
  955.         fParaFmt.newPage= FALSE; /* ?? ?? */
  956.         break;
  957.     case rtfColumn:
  958.         break;
  959.     case rtfLine:
  960.         PutLitCharWithStyle ('\n');
  961.         break;
  962.         
  963.     case rtfSoftPage:
  964.         break;
  965.     case rtfSoftColumn:
  966.         break;
  967.     case rtfSoftLine:
  968.         break;
  969.     case rtfSoftLineHt:
  970.         break;
  971.         
  972.     case rtfTab:
  973.         PutLitCharWithStyle ('\t'); 
  974.         break;
  975.         
  976.     case rtfEmDash:
  977.         PutStdCharWithStyle (rtfSC_emdash);
  978.         break;
  979.     case rtfEnDash:
  980.         PutStdCharWithStyle (rtfSC_endash);
  981.         break;
  982.     case rtfEmSpace:
  983.         break;
  984.     case rtfEnSpace:
  985.         break;
  986.     case rtfBullet:
  987.         PutStdCharWithStyle (rtfSC_bullet);
  988.         break;
  989.     case rtfLQuote:
  990.         PutStdCharWithStyle (rtfSC_quoteleft);
  991.         break;
  992.     case rtfRQuote:
  993.         PutStdCharWithStyle (rtfSC_quoteright);
  994.         break;
  995.     case rtfLDblQuote:
  996.         PutStdCharWithStyle (rtfSC_quotedblleft);
  997.         break;
  998.     case rtfRDblQuote:
  999.         PutStdCharWithStyle (rtfSC_quotedblright);
  1000.         break;
  1001.     case rtfFormula:
  1002.         break;
  1003.     case rtfNoBrkSpace:
  1004.         PutStdCharWithStyle (rtfSC_nobrkspace);
  1005.         break;
  1006.     case rtfNoReqHyphen:
  1007.         break;
  1008.     case rtfNoBrkHyphen:
  1009.         PutStdCharWithStyle (rtfSC_nobrkhyphen);
  1010.         break;
  1011.     case rtfOptDest:
  1012.         break;
  1013.     case rtfLTRMark:
  1014.         break;
  1015.     case rtfRTLMark:
  1016.         break;
  1017.     case rtfNoWidthJoiner:
  1018.         break;
  1019.     case rtfNoWidthNonJoiner:
  1020.         break;
  1021.     case rtfCurHeadPict:
  1022.         break;
  1023.     }
  1024. }
  1025.  
  1026.  
  1027. void DRTFprocess::DocAttr()
  1028. {
  1029.     switch (fMinor)
  1030.     {
  1031.     case rtfDefTab:
  1032.         fParaFmt.deftabstop = (int) fParam / 20;
  1033.         break;
  1034.         
  1035.     case rtfHyphHotZone:
  1036.         break;
  1037.     case rtfHyphConsecLines:
  1038.         break;
  1039.     case rtfHyphCaps:
  1040.         break;
  1041.     case rtfHyphAuto:
  1042.         break;
  1043.     case rtfLineStart:
  1044.         break;
  1045.     case rtfFracWidth:
  1046.         break;
  1047.     case rtfMakeBackup:
  1048.         break;
  1049.     case rtfRTFDefault:
  1050.         break;
  1051.     case rtfPSOverlay:
  1052.         break;
  1053.     case rtfDocTemplate:
  1054.         break;
  1055.     case rtfDefLanguage:
  1056.         break;
  1057.     case rtfFENoteType:
  1058.         break;
  1059.     case rtfFNoteEndSect:
  1060.         break;
  1061.     case rtfFNoteEndDoc:
  1062.         break;
  1063.     case rtfFNoteText:
  1064.         break;
  1065.     case rtfFNoteBottom:
  1066.         break;
  1067.     case rtfENoteEndSect:
  1068.         break;
  1069.     case rtfENoteEndDoc:
  1070.         break;
  1071.     case rtfENoteText:
  1072.         break;
  1073.     case rtfENoteBottom:
  1074.         break;
  1075.     case rtfFNoteStart:
  1076.         break;
  1077.     case rtfENoteStart:
  1078.         break;
  1079.     case rtfFNoteRestartPage:
  1080.         break;
  1081.     case rtfFNoteRestart:
  1082.         break;
  1083.     case rtfFNoteRestartCont:
  1084.         break;
  1085.     case rtfENoteRestart:
  1086.         break;
  1087.     case rtfENoteRestartCont:
  1088.         break;
  1089.     case rtfFNoteNumArabic:
  1090.         break;
  1091.     case rtfFNoteNumLLetter:
  1092.         break;
  1093.     case rtfFNoteNumULetter:
  1094.         break;
  1095.     case rtfFNoteNumLRoman:
  1096.         break;
  1097.     case rtfFNoteNumURoman:
  1098.         break;
  1099.     case rtfFNoteNumChicago:
  1100.         break;
  1101.     case rtfENoteNumArabic:
  1102.         break;
  1103.     case rtfENoteNumLLetter:
  1104.         break;
  1105.     case rtfENoteNumULetter:
  1106.         break;
  1107.     case rtfENoteNumLRoman:
  1108.         break;
  1109.     case rtfENoteNumURoman:
  1110.         break;
  1111.     case rtfENoteNumChicago:
  1112.         break;
  1113.         
  1114.     case rtfPaperWidth:
  1115.         break;
  1116.     case rtfPaperHeight:
  1117.         break;
  1118.     case rtfPaperSize:
  1119.         break;
  1120.     case rtfLeftMargin:
  1121.         break;
  1122.     case rtfRightMargin:
  1123.         break;
  1124.     case rtfTopMargin:
  1125.         break;
  1126.     case rtfBottomMargin:
  1127.         break;
  1128.     case rtfFacingPage:
  1129.         break;
  1130.     case rtfGutterWid:
  1131.         break;
  1132.     case rtfMirrorMargin:
  1133.         break;
  1134.     case rtfLandscape:
  1135.         break;
  1136.     case rtfPageStart:
  1137.         break;
  1138.     case rtfWidowCtrl:
  1139.         break;
  1140.     case rtfLinkStyles:
  1141.         break;
  1142.     case rtfNoAutoTabIndent:
  1143.         break;
  1144.     case rtfWrapSpaces:
  1145.         break;
  1146.     case rtfPrintColorsBlack:
  1147.         break;
  1148.     case rtfNoExtraSpaceRL:
  1149.         break;
  1150.     case rtfNoColumnBalance:
  1151.         break;
  1152.     case rtfCvtMailMergeQuote:
  1153.         break;
  1154.     case rtfSuppressTopSpace:
  1155.         break;
  1156.     case rtfSuppressPreParSpace:
  1157.         break;
  1158.     case rtfCombineTblBorders:
  1159.         break;
  1160.     case rtfTranspMetafiles:
  1161.         break;
  1162.     case rtfSwapBorders:
  1163.         break;
  1164.     case rtfShowHardBreaks:
  1165.         break;
  1166.     case rtfFormProtected:
  1167.         break;
  1168.     case rtfAllProtected:
  1169.         break;
  1170.     case rtfFormShading:
  1171.         break;
  1172.     case rtfFormDisplay:
  1173.         break;
  1174.     case rtfPrintData:
  1175.         break;
  1176.     case rtfRevProtected:
  1177.         break;
  1178.     case rtfRevisions:
  1179.         break;
  1180.     case rtfRevDisplay:
  1181.         break;
  1182.     case rtfRevBar:
  1183.         break;
  1184.     case rtfAnnotProtected:
  1185.         break;
  1186.     case rtfRTLDoc:
  1187.         break;
  1188.     case rtfLTRDoc:
  1189.         break;
  1190.     }
  1191. }
  1192.  
  1193.  
  1194. void DRTFprocess::SectAttr()
  1195. {
  1196.     switch (fMinor)
  1197.     {
  1198.     case rtfSectDef:
  1199.         break;
  1200.     case rtfENoteHere:
  1201.         break;
  1202.     case rtfPrtBinFirst:
  1203.         break;
  1204.     case rtfPrtBin:
  1205.         break;
  1206.     case rtfSectStyleNum:
  1207.         break;
  1208.     case rtfNoBreak:
  1209.         break;
  1210.     case rtfColBreak:
  1211.         break;
  1212.     case rtfPageBreak:
  1213.         break;
  1214.     case rtfEvenBreak:
  1215.         break;
  1216.     case rtfOddBreak:
  1217.         break;
  1218.     case rtfColumns:
  1219.         break;
  1220.     case rtfColumnSpace:
  1221.         break;
  1222.     case rtfColumnNumber:
  1223.         break;
  1224.     case rtfColumnSpRight:
  1225.         break;
  1226.     case rtfColumnWidth:
  1227.         break;
  1228.     case rtfColumnLine:
  1229.         break;
  1230.     case rtfLineModulus:
  1231.         break;
  1232.     case rtfLineDist:
  1233.         break;
  1234.     case rtfLineStarts:
  1235.         break;
  1236.     case rtfLineRestart:
  1237.         break;
  1238.     case rtfLineRestartPg:
  1239.         break;
  1240.     case rtfLineCont:
  1241.         break;
  1242.     case rtfSectPageWid:
  1243.         break;
  1244.     case rtfSectPageHt:
  1245.         break;
  1246.     case rtfSectMarginLeft:
  1247.         break;
  1248.     case rtfSectMarginRight:
  1249.         break;
  1250.     case rtfSectMarginTop:
  1251.         break;
  1252.     case rtfSectMarginBottom:
  1253.         break;
  1254.     case rtfSectMarginGutter:
  1255.         break;
  1256.     case rtfSectLandscape:
  1257.         break;
  1258.     case rtfTitleSpecial:
  1259.         break;
  1260.     case rtfHeaderY:
  1261.         break;
  1262.     case rtfFooterY:
  1263.         break;
  1264.     case rtfPageStarts:
  1265.         break;
  1266.     case rtfPageCont:
  1267.         break;
  1268.     case rtfPageRestart:
  1269.         break;
  1270.     case rtfPageNumRight:
  1271.         break;
  1272.     case rtfPageNumTop:
  1273.         break;
  1274.     case rtfPageDecimal:
  1275.         break;
  1276.     case rtfPageURoman:
  1277.         break;
  1278.     case rtfPageLRoman:
  1279.         break;
  1280.     case rtfPageULetter:
  1281.         break;
  1282.     case rtfPageLLetter:
  1283.         break;
  1284.     case rtfPageNumHyphSep:
  1285.         break;
  1286.     case rtfPageNumSpaceSep:
  1287.         break;
  1288.     case rtfPageNumColonSep:
  1289.         break;
  1290.     case rtfPageNumEmdashSep:
  1291.         break;
  1292.     case rtfPageNumEndashSep:
  1293.         break;
  1294.     case rtfTopVAlign:
  1295.         break;
  1296.     case rtfBottomVAlign:
  1297.         break;
  1298.     case rtfCenterVAlign:
  1299.         break;
  1300.     case rtfJustVAlign:
  1301.         break;
  1302.     case rtfRTLSect:
  1303.         break;
  1304.     case rtfLTRSect:
  1305.         break;
  1306.     }
  1307. }
  1308.  
  1309.  
  1310. void DRTFprocess::TblAttr()
  1311. {
  1312.     switch (fMinor)
  1313.     {
  1314.     case rtfRowDef:
  1315.         break;
  1316.     case rtfRowGapH:
  1317.         break;
  1318.     case rtfCellPos:
  1319.         break;
  1320.     case rtfMergeRngFirst:
  1321.         break;
  1322.     case rtfMergePrevious:
  1323.         break;
  1324.     case rtfRowLeft:
  1325.         break;
  1326.     case rtfRowRight:
  1327.         break;
  1328.     case rtfRowCenter:
  1329.         break;
  1330.     case rtfRowLeftEdge:
  1331.         break;
  1332.     case rtfRowHt:
  1333.         break;
  1334.     case rtfRowHeader:
  1335.         break;
  1336.     case rtfRowKeep:
  1337.         break;
  1338.     case rtfRTLRow:
  1339.         break;
  1340.     case rtfLTRRow:
  1341.         break;
  1342.     case rtfRowBordTop:
  1343.         break;
  1344.     case rtfRowBordLeft:
  1345.         break;
  1346.     case rtfRowBordBottom:
  1347.         break;
  1348.     case rtfRowBordRight:
  1349.         break;
  1350.     case rtfRowBordHoriz:
  1351.         break;
  1352.     case rtfRowBordVert:
  1353.         break;
  1354.     case rtfCellBordBottom:
  1355.         break;
  1356.     case rtfCellBordTop:
  1357.         break;
  1358.     case rtfCellBordLeft:
  1359.         break;
  1360.     case rtfCellBordRight:
  1361.         break;
  1362.     case rtfCellShading:
  1363.         break;
  1364.     case rtfCellBgPatH:
  1365.         break;
  1366.     case rtfCellBgPatV:
  1367.         break;
  1368.     case rtfCellFwdDiagBgPat:
  1369.         break;
  1370.     case rtfCellBwdDiagBgPat:
  1371.         break;
  1372.     case rtfCellHatchBgPat:
  1373.         break;
  1374.     case rtfCellDiagHatchBgPat:
  1375.         break;
  1376.     case rtfCellDarkBgPatH:
  1377.         break;
  1378.     case rtfCellDarkBgPatV:
  1379.         break;
  1380.     case rtfCellFwdDarkBgPat:
  1381.         break;
  1382.     case rtfCellBwdDarkBgPat:
  1383.         break;
  1384.     case rtfCellDarkHatchBgPat:
  1385.         break;
  1386.     case rtfCellDarkDiagHatchBgPat:
  1387.         break;
  1388.     case rtfCellBgPatLineColor:
  1389.         break;
  1390.     case rtfCellBgPatColor:
  1391.         break;
  1392.     }
  1393. }
  1394.  
  1395.  
  1396. void DRTFprocess::ParAttr()
  1397. {
  1398.     switch (fMinor)
  1399.     {
  1400.     case rtfParDef:
  1401.         DefaultParag();
  1402.         break;
  1403.     case rtfStyleNum:
  1404.         RTFExpandStyle (fParam);
  1405.         break;
  1406.         
  1407.     case rtfHyphenate:
  1408.         break;
  1409.     case rtfInTable:
  1410.         break;
  1411.     case rtfKeep:
  1412.         break;
  1413.     case rtfNoWidowControl:
  1414.         break;
  1415.     case rtfKeepNext:
  1416.         break;
  1417.     case rtfOutlineLevel:
  1418.         break;
  1419.     case rtfNoLineNum:
  1420.         break;
  1421.     case rtfPBBefore:
  1422.         break;
  1423.     case rtfSideBySide:
  1424.         break;
  1425.     case rtfQuadLeft:
  1426.         fParaFmt.just= 'l';
  1427.         break;
  1428.     case rtfQuadRight:
  1429.         fParaFmt.just= 'r';
  1430.         break;
  1431.     case rtfQuadJust:
  1432.         fParaFmt.just= 'l';
  1433.         break;
  1434.     case rtfQuadCenter:
  1435.         fParaFmt.just= 'c';
  1436.         break;
  1437.  
  1438.     case rtfFirstIndent:
  1439.         fParaFmt.firstInset= fParam / 20;  
  1440.         break;
  1441.     case rtfLeftIndent:
  1442.         fParaFmt.leftInset= fParam / 20;  
  1443.         break;
  1444.     case rtfRightIndent:
  1445.         fParaFmt.rightInset= fParam / 20; 
  1446.         break;
  1447.  
  1448. #if 1        
  1449.     case rtfSpaceBefore:
  1450.         fParaFmt.spaceBefore= fParam / 20; 
  1451.         break;
  1452.     case rtfSpaceAfter:
  1453.         fParaFmt.spaceAfter= fParam / 20; 
  1454.         break;
  1455. #endif
  1456.     case rtfSpaceBetween:
  1457.         fParaFmt.spaceBetween= fParam / 20; 
  1458.         break;
  1459.     case rtfSpaceMultiply:
  1460.         fParaFmt.spaceMultiply= (fParam > 0); 
  1461.         break;
  1462.     case rtfSubDocument:
  1463.         break;
  1464.     case rtfRTLPar:
  1465.         break;
  1466.     case rtfLTRPar:
  1467.         break;
  1468.         
  1469.     case rtfTabPos:
  1470.         if (fParaFmt.numstops<kMaxstops) {
  1471.         fParaFmt.tabkinds[fParaFmt.numstops]= DParagraph::kTabLeft;   
  1472.         fParaFmt.tabstops[fParaFmt.numstops++]= fParam / 20; 
  1473.         } 
  1474.         break;
  1475.     case rtfTabLeft:
  1476.         if (fParaFmt.numstops<kMaxstops) 
  1477.         fParaFmt.tabkinds[fParaFmt.numstops]= DParagraph::kTabLeft;  
  1478.         break;
  1479.     case rtfTabRight:
  1480.         if (fParaFmt.numstops<kMaxstops) 
  1481.         fParaFmt.tabkinds[fParaFmt.numstops]= DParagraph::kTabRight;  
  1482.         break;
  1483.     case rtfTabCenter:
  1484.         if (fParaFmt.numstops<kMaxstops) 
  1485.         fParaFmt.tabkinds[fParaFmt.numstops]= DParagraph::kTabCenter;  
  1486.         break;
  1487.     case rtfTabDecimal:
  1488.         if (fParaFmt.numstops<kMaxstops) 
  1489.         fParaFmt.tabkinds[fParaFmt.numstops]= DParagraph::kTabDecimal;  
  1490.         break;
  1491.     case rtfTabBar:
  1492.         if (fParaFmt.numstops<kMaxstops) {
  1493.         fParaFmt.tabkinds[fParaFmt.numstops]= DParagraph::kTabBar;  
  1494.         fParaFmt.tabstops[fParaFmt.numstops++]= fParam / 20;  
  1495.         }
  1496.         break;
  1497.         
  1498.     case rtfLeaderDot:
  1499.         fParaFmt.tablead= '.';
  1500.         break;
  1501.     case rtfLeaderHyphen:
  1502.         fParaFmt.tablead= '-';
  1503.         break;
  1504.     case rtfLeaderUnder:
  1505.         fParaFmt.tablead= '_';
  1506.         break;
  1507.     case rtfLeaderThick:
  1508.         fParaFmt.tablead= '=';
  1509.         break;
  1510.     case rtfLeaderEqual:
  1511.         fParaFmt.tablead= '=';
  1512.         break;
  1513.         
  1514.     case rtfParLevel:
  1515.         break;
  1516.     case rtfParBullet:
  1517.         break;
  1518.     case rtfParSimple:
  1519.         break;
  1520.     case rtfParNumCont:
  1521.         break;
  1522.     case rtfParNumOnce:
  1523.         break;
  1524.     case rtfParNumAcross:
  1525.         break;
  1526.     case rtfParHangIndent:
  1527.         break;
  1528.     case rtfParNumRestart:
  1529.         break;
  1530.     case rtfParNumCardinal:
  1531.         break;
  1532.     case rtfParNumDecimal:
  1533.         break;
  1534.     case rtfParNumULetter:
  1535.         break;
  1536.     case rtfParNumURoman:
  1537.         break;
  1538.     case rtfParNumLLetter:
  1539.         break;
  1540.     case rtfParNumLRoman:
  1541.         break;
  1542.     case rtfParNumOrdinal:
  1543.         break;
  1544.     case rtfParNumOrdinalText:
  1545.         break;
  1546.     case rtfParNumBold:
  1547.         break;
  1548.     case rtfParNumItalic:
  1549.         break;
  1550.     case rtfParNumAllCaps:
  1551.         break;
  1552.     case rtfParNumSmallCaps:
  1553.         break;
  1554.     case rtfParNumUnder:
  1555.         break;
  1556.     case rtfParNumDotUnder:
  1557.         break;
  1558.     case rtfParNumDbUnder:
  1559.         break;
  1560.     case rtfParNumNoUnder:
  1561.         break;
  1562.     case rtfParNumWordUnder:
  1563.         break;
  1564.     case rtfParNumStrikethru:
  1565.         break;
  1566.     case rtfParNumForeColor:
  1567.         break;
  1568.     case rtfParNumFont:
  1569.         break;
  1570.     case rtfParNumFontSize:
  1571.         break;
  1572.     case rtfParNumIndent:
  1573.         break;
  1574.     case rtfParNumSpacing:
  1575.         break;
  1576.     case rtfParNumInclPrev:
  1577.         break;
  1578.     case rtfParNumCenter:
  1579.         break;
  1580.     case rtfParNumLeft:
  1581.         break;
  1582.     case rtfParNumRight:
  1583.         break;
  1584.     case rtfParNumStartAt:
  1585.         break;
  1586.  
  1587.           
  1588.     case rtfBorderTop:
  1589.         fParaFmt.bordertop= TRUE;
  1590.         break;
  1591.     case rtfBorderBottom:
  1592.         fParaFmt.borderbottom= TRUE;
  1593.         /* no help to missing bordr... fParaFmt.leadHeight = 3; /* depends on style... */
  1594.         break;
  1595.     case rtfBorderLeft:
  1596.         fParaFmt.borderleft= TRUE;
  1597.         break;
  1598.     case rtfBorderRight:
  1599.         fParaFmt.borderright= TRUE;
  1600.         break;
  1601.     case rtfBorderBetween:
  1602.         fParaFmt.borderbetween= TRUE;
  1603.         break;
  1604.     case rtfBorderBar:
  1605.         fParaFmt.borderbar= TRUE;
  1606.         break;
  1607.     case rtfBorderBox:
  1608.         fParaFmt.borderbox= TRUE;
  1609.         break;
  1610.         
  1611.     case rtfBorderSingle:
  1612.         fParaFmt.borderstyle = DParagraph::kBorderSingle;
  1613.         break;
  1614.     case rtfBorderThick:
  1615.         fParaFmt.borderstyle = DParagraph::kBorderThick;
  1616.         break;
  1617.     case rtfBorderShadow:
  1618.         fParaFmt.borderstyle = DParagraph::kBorderShadow;
  1619.         break;
  1620.     case rtfBorderDouble:
  1621.         fParaFmt.borderstyle = DParagraph::kBorderDouble;
  1622.         break;
  1623.     case rtfBorderDot:
  1624.         fParaFmt.borderstyle = DParagraph::kBorderDot;
  1625.         break;
  1626.     case rtfBorderDash:
  1627.         fParaFmt.borderstyle = DParagraph::kBorderDash;
  1628.         break;
  1629.     case rtfBorderHair:
  1630.         fParaFmt.borderstyle = DParagraph::kBorderHair;
  1631.         break;
  1632.     case rtfBorderWidth:
  1633.         break;
  1634.     case rtfBorderColor:
  1635.         break;
  1636.     case rtfBorderSpace:
  1637.         break;
  1638.  
  1639.         
  1640.     case rtfShading:
  1641.         break;
  1642.     case rtfBgPatH:
  1643.         break;
  1644.     case rtfBgPatV:
  1645.         break;
  1646.     case rtfFwdDiagBgPat:
  1647.         break;
  1648.     case rtfBwdDiagBgPat:
  1649.         break;
  1650.     case rtfHatchBgPat:
  1651.         break;
  1652.     case rtfDiagHatchBgPat:
  1653.         break;
  1654.     case rtfDarkBgPatH:
  1655.         break;
  1656.     case rtfDarkBgPatV:
  1657.         break;
  1658.     case rtfFwdDarkBgPat:
  1659.         break;
  1660.     case rtfBwdDarkBgPat:
  1661.         break;
  1662.     case rtfDarkHatchBgPat:
  1663.         break;
  1664.     case rtfDarkDiagHatchBgPat:
  1665.         break;
  1666.     case rtfBgPatLineColor:
  1667.         break;
  1668.     case rtfBgPatColor:
  1669.         break;
  1670.     }
  1671. }
  1672.  
  1673.  
  1674. /*
  1675.  * Several of the attributes can be turned off with param value
  1676.  * of zero (e.g., \b vs. \b0), but since the value of fParam
  1677.  * is 0 if no param is given, test the text of the token directly.
  1678.  */
  1679.  
  1680.  
  1681.  
  1682. void DRTFprocess::CharAttr()
  1683. {
  1684.     int    turnOn = (rtfTextBuf[rtfTextLen-1] != '0'); 
  1685.     //NewStyle(); //x
  1686.  
  1687.     switch (fMinor)
  1688.     {
  1689.     case rtfFontNum:
  1690.         {
  1691.         RTFFont * rfnt= RTFGetFont (fParam);
  1692.         if (rfnt) {
  1693.             fStyleRec.fontname= rfnt->rtfFName;
  1694.             switch (rfnt->rtfFFamily) {
  1695.                 case rtfFFRoman : fStyleRec.fontfamily= "Roman"; break;
  1696.                 case rtfFFSwiss : fStyleRec.fontfamily= "Swiss"; break;
  1697.                 case rtfFFModern: fStyleRec.fontfamily= "Modern"; break;
  1698.                 case rtfFFDecor : fStyleRec.fontfamily= "Decorative"; break;
  1699.                 case rtfFFTech     :
  1700.                 case rtfFFNil     : 
  1701.                 default                    : fStyleRec.fontfamily= NULL; break;
  1702.                 }
  1703.             /* !! add default font size ... msword-rtf often leaves out fsize if == 12 pts ! */
  1704.           /* fStyleRec.fontsize= kDefaultFontsize; */
  1705.             }
  1706.         NewStyle();
  1707.             
  1708.         switch (RTFGetCharSet()) {
  1709.             default:         
  1710.             case rtfCSGeneral:
  1711.                 if (fOutMap != gGenCharMap) fOutMap= gGenCharMap;
  1712.                 break;
  1713.             case rtfCSSymbol:
  1714.                 if (fOutMap != gSymCharMap) fOutMap= gSymCharMap;
  1715.                 break;
  1716.             }
  1717.         }
  1718.         break;
  1719.         
  1720.     case rtfFontSize:
  1721.         NewStyle();
  1722.         /* sizes are in half-points, convert to whole points */
  1723.         fStyleRec.fontsize = (int) (fParam / 2);
  1724.         if (fStyleRec.fontsize <= 0) fStyleRec.fontsize = kDefaultFontsize;     /* default size */
  1725.         break;
  1726.  
  1727.     case rtfPlain:
  1728.         NewStyle();
  1729.         fStyleRec.style.bold= FALSE;
  1730.         fStyleRec.style.italic= FALSE;
  1731.         fStyleRec.style.underline= 0;
  1732.         fStyleRec.style.hidden= FALSE;
  1733.         fStyleRec.style.outline= FALSE;
  1734.         fStyleRec.style.strikeout= FALSE;
  1735.         fStyleRec.style.shadow= FALSE;
  1736.         fStyleRec.style.allcaps= FALSE;
  1737.         fStyleRec.style.smallcaps= FALSE;
  1738.         fStyleRec.style.superSub= 0; 
  1739.         fStyleRec.style.color= kBlackColor;  
  1740.         fStyleRec.fontsize= kDefaultFontsize;     /* ?? is this part of plain ? */
  1741.         break;
  1742.         
  1743.     case rtfBold:
  1744.         NewStyle();
  1745.         fStyleRec.style.bold= turnOn;
  1746.         break;
  1747.     case rtfItalic:
  1748.         NewStyle();
  1749.         fStyleRec.style.italic= turnOn;
  1750.         break;
  1751.     case rtfUnderline:
  1752.         NewStyle();
  1753.         if (turnOn) fStyleRec.style.underline = DRichStyle::kUnderline;
  1754.         else fStyleRec.style.underline= 0;
  1755.         break;
  1756.     case rtfWordUnderline:
  1757.         NewStyle();
  1758.         if (turnOn) fStyleRec.style.underline = DRichStyle::kWorduline;
  1759.         else fStyleRec.style.underline= 0;
  1760.         break;
  1761.     case rtfDotUnderline:
  1762.         NewStyle();
  1763.         if (turnOn) fStyleRec.style.underline = DRichStyle::kDotuline;
  1764.         else fStyleRec.style.underline= 0;
  1765.         break;
  1766.     case rtfDbUnderline:
  1767.         NewStyle();
  1768.         if (turnOn) fStyleRec.style.underline = DRichStyle::kDbluline;
  1769.         else fStyleRec.style.underline= 0;
  1770.         break;
  1771.     case rtfNoUnderline:
  1772.         NewStyle();
  1773.         fStyleRec.style.underline= 0;
  1774.         break;
  1775.     case rtfInvisible:
  1776.         NewStyle();
  1777.         fStyleRec.style.hidden= turnOn;
  1778.         break;
  1779.  
  1780.     case rtfOutline:
  1781.         NewStyle();
  1782.         fStyleRec.style.outline= turnOn;
  1783.         break;
  1784.     case rtfAllCaps:
  1785.         NewStyle();
  1786.         fStyleRec.style.allcaps= turnOn;
  1787.         break;
  1788.     case rtfSmallCaps:
  1789.         NewStyle();
  1790.         fStyleRec.style.smallcaps= turnOn;
  1791.         break;
  1792.     case rtfShadow:
  1793.         NewStyle();
  1794.         fStyleRec.style.shadow= turnOn;
  1795.         break;
  1796.     case rtfStrikeThru:
  1797.         NewStyle();
  1798.         fStyleRec.style.strikeout= turnOn;
  1799.         break;
  1800.         
  1801.     case rtfForeColor:
  1802.         {
  1803.         RTFColor *rclr;        
  1804.         NewStyle();
  1805.         rclr= RTFGetColor (fParam);
  1806.         if (rclr) {
  1807.             /* damn, we now have to select color to read it's nlm value... */
  1808.             Nlm_SelectColor( rclr->rtfCRed, rclr->rtfCGreen, rclr->rtfCBlue);
  1809.             fStyleRec.style.color= Nlm_GetColor();
  1810.             }
  1811.         }
  1812.         break;
  1813.     case rtfBackColor:
  1814.         break;
  1815.  
  1816.     case rtfSubScript:
  1817.         NewStyle();
  1818.         fStyleRec.style.superSub=  (int) fParam / 2 ;
  1819.         break;
  1820.     case rtfSubScrShrink:
  1821.         NewStyle();
  1822.         fStyleRec.style.superSub=  (int) (fParam/ 2 );  
  1823.         break;
  1824.     case rtfSuperScript:
  1825.         NewStyle();
  1826.         fStyleRec.style.superSub=  - (int) (fParam/ 2 ); 
  1827.         break;
  1828.     case rtfSuperScrShrink:
  1829.         NewStyle();
  1830.         fStyleRec.style.superSub=  - (int) (fParam/ 2 ); 
  1831.         break;
  1832.     case rtfNoSuperSub:
  1833.         NewStyle();
  1834.         fStyleRec.style.superSub= 0;
  1835.         break;
  1836.  
  1837.         
  1838.     case rtfDeleted:
  1839.         break;
  1840.     case rtfExpand:
  1841.         break;
  1842.     case rtfExpandTwips:
  1843.         break;
  1844.     case rtfKerning:
  1845.         break;
  1846.     case rtfRevised:
  1847.         break;
  1848.     case rtfRevAuthor:
  1849.         break;
  1850.     case rtfRevDTTM:
  1851.         break;
  1852.     case rtfRTLChar:
  1853.         break;
  1854.     case rtfLTRChar:
  1855.         break;
  1856.     case rtfCharStyleNum:
  1857.         break;
  1858.     case rtfCharCharSet:
  1859.         break;
  1860.     case rtfLanguage:
  1861.         SelectLanguage();
  1862.         break;
  1863.     case rtfGray:
  1864.         break;
  1865.     }
  1866. }
  1867.  
  1868.  
  1869. void DRTFprocess::PictAttr()
  1870. {
  1871.  
  1872.     /* all RTF sizes are in Twentieths of a Point (twip), assume 72 points/inch */
  1873.     /* !! assume point == pixel size, bad assumption ?*/
  1874.     fInPic= TRUE;
  1875.     //x NewStyle();
  1876.  
  1877.     switch (fMinor)
  1878.     {
  1879.     case rtfMacQD:
  1880.         fPictKind= DPictStyle::kPictMac;
  1881.         break;
  1882.     case rtfPMMetafile:
  1883.         fPictKind= DPictStyle::kPictPMMeta;
  1884.         break;
  1885.     case rtfWinMetafile:
  1886.         fPictKind= DPictStyle::kPictWinMeta;
  1887.         break;
  1888.     case rtfDevIndBitmap:
  1889.         fPictKind= DPictStyle::kPictDIBits;
  1890.         break;
  1891.     case rtfWinBitmap:
  1892.         fPictKind= DPictStyle::kPictWinBits;
  1893.         break;
  1894.         
  1895.     case rtfPixelBits:
  1896.         break;
  1897.     case rtfBitmapPlanes:
  1898.         break;
  1899.     case rtfBitmapWid:
  1900.         break;
  1901.         
  1902.     case rtfPicWid:
  1903.         fStyleRec.style.pixwidth= fParam; 
  1904.         break;
  1905.     case rtfPicHt:
  1906.         fStyleRec.style.pixheight= fParam;
  1907.         break;
  1908.         
  1909.     case rtfPicGoalWid:
  1910.         break;
  1911.     case rtfPicGoalHt:
  1912.         break;
  1913.     case rtfPicScaleX:
  1914.         break;
  1915.     case rtfPicScaleY:
  1916.         break;
  1917.     case rtfPicScaled:
  1918.         break;
  1919.         
  1920.     case rtfPicCropTop:
  1921.         break;
  1922.     case rtfPicCropBottom:
  1923.         break;
  1924.     case rtfPicCropLeft:
  1925.         break;
  1926.     case rtfPicCropRight:
  1927.         break;
  1928.     case rtfPicMFHasBitmap:
  1929.         break;
  1930.     case rtfPicMFBitsPerPixel:
  1931.         break;
  1932.     case rtfPicBinary:
  1933.         break;
  1934.     }
  1935. }
  1936.  
  1937.  
  1938. void DRTFprocess::BookmarkAttr()
  1939. {
  1940.     switch (fMinor)
  1941.     {
  1942.     case rtfBookmarkFirstCol:
  1943.         break;
  1944.     case rtfBookmarkLastCol:
  1945.         break;
  1946.     }
  1947. }
  1948.  
  1949.  
  1950. void DRTFprocess::NeXTGrAttr()
  1951. {
  1952.     switch (fMinor)
  1953.     {
  1954.     case rtfNeXTGWidth:
  1955.         break;
  1956.     case rtfNeXTGHeight:
  1957.         break;
  1958.     }
  1959. }
  1960.  
  1961.  
  1962. void DRTFprocess::FieldAttr()
  1963. {
  1964.     switch (fMinor)
  1965.     {
  1966.     case rtfFieldDirty:
  1967.         break;
  1968.     case rtfFieldEdited:
  1969.         break;
  1970.     case rtfFieldLocked:
  1971.         break;
  1972.     case rtfFieldPrivate:
  1973.         break;
  1974.     case rtfFieldAlt:
  1975.         break;
  1976.     }
  1977. }
  1978.  
  1979.  
  1980. void DRTFprocess::TOCAttr()
  1981. {
  1982.     switch (fMinor)
  1983.     {
  1984.     case rtfTOCType:
  1985.         break;
  1986.     case rtfTOCLevel:
  1987.         break;
  1988.     }
  1989. }
  1990.  
  1991.  
  1992. void DRTFprocess::PosAttr()
  1993. {
  1994.     switch (fMinor)
  1995.     {
  1996.     case rtfAbsWid:
  1997.         break;
  1998.     case rtfAbsHt:
  1999.         break;
  2000.     case rtfRPosMargH:
  2001.         break;
  2002.     case rtfRPosPageH:
  2003.         break;
  2004.     case rtfRPosColH:
  2005.         break;
  2006.     case rtfPosX:
  2007.         break;
  2008.     case rtfPosNegX:
  2009.         break;
  2010.     case rtfPosXCenter:
  2011.         break;
  2012.     case rtfPosXInside:
  2013.         break;
  2014.     case rtfPosXOutSide:
  2015.         break;
  2016.     case rtfPosXRight:
  2017.         break;
  2018.     case rtfPosXLeft:
  2019.         break;
  2020.     case rtfRPosMargV:
  2021.         break;
  2022.     case rtfRPosPageV:
  2023.         break;
  2024.     case rtfRPosParaV:
  2025.         break;
  2026.     case rtfPosY:
  2027.         break;
  2028.     case rtfPosNegY:
  2029.         break;
  2030.     case rtfPosYInline:
  2031.         break;
  2032.     case rtfPosYTop:
  2033.         break;
  2034.     case rtfPosYCenter:
  2035.         break;
  2036.     case rtfPosYBottom:
  2037.         break;
  2038.     case rtfNoWrap:
  2039.         break;
  2040.     case rtfDistFromTextAll:
  2041.         break;
  2042.     case rtfDistFromTextX:
  2043.         break;
  2044.     case rtfDistFromTextY:
  2045.         break;
  2046.     case rtfTextDistY:
  2047.         break;
  2048.     case rtfDropCapLines:
  2049.         break;
  2050.     case rtfDropCapType:
  2051.         break;
  2052.     }
  2053. }
  2054.  
  2055.  
  2056. void DRTFprocess::ObjAttr()
  2057. {
  2058.     switch (fMinor)
  2059.     {
  2060.     case rtfObjEmb:
  2061.         break;
  2062.     case rtfObjLink:
  2063.         break;
  2064.     case rtfObjAutoLink:
  2065.         break;
  2066.     case rtfObjSubscriber:
  2067.         break;
  2068.     case rtfObjPublisher:
  2069.         break;
  2070.     case rtfObjICEmb:
  2071.         break;
  2072.     case rtfObjLinkSelf:
  2073.         break;
  2074.     case rtfObjLock:
  2075.         break;
  2076.     case rtfObjUpdate:
  2077.         break;
  2078.     case rtfObjHt:
  2079.         break;
  2080.     case rtfObjWid:
  2081.         break;
  2082.     case rtfObjSetSize:
  2083.         break;
  2084.     case rtfObjAlign:
  2085.         break;
  2086.     case rtfObjTransposeY:
  2087.         break;
  2088.     case rtfObjCropTop:
  2089.         break;
  2090.     case rtfObjCropBottom:
  2091.         break;
  2092.     case rtfObjCropLeft:
  2093.         break;
  2094.     case rtfObjCropRight:
  2095.         break;
  2096.     case rtfObjScaleX:
  2097.         break;
  2098.     case rtfObjScaleY:
  2099.         break;
  2100.     case rtfObjResRTF:
  2101.         break;
  2102.     case rtfObjResPict:
  2103.         break;
  2104.     case rtfObjResBitmap:
  2105.         break;
  2106.     case rtfObjResText:
  2107.         break;
  2108.     case rtfObjResMerge:
  2109.         break;
  2110.     case rtfObjBookmarkPubObj:
  2111.         break;
  2112.     case rtfObjPubAutoUpdate:
  2113.         break;
  2114.     }
  2115. }
  2116.  
  2117.  
  2118. void DRTFprocess::FNoteAttr()
  2119. {
  2120.     switch (fMinor)
  2121.     {
  2122.     case rtfFNAlt:
  2123.         break;
  2124.     }
  2125. }
  2126.  
  2127.  
  2128. void DRTFprocess::KeyCodeAttr()
  2129. {
  2130.     switch (fMinor)
  2131.     {
  2132.     case rtfAltKey:
  2133.         break;
  2134.     case rtfShiftKey:
  2135.         break;
  2136.     case rtfControlKey:
  2137.         break;
  2138.     case rtfFunctionKey:
  2139.         break;
  2140.     }
  2141. }
  2142.  
  2143.  
  2144. void DRTFprocess::ACharAttr()
  2145. {
  2146.     switch (fMinor)
  2147.     {
  2148.     case rtfACBold:
  2149.         break;
  2150.     case rtfACAllCaps:
  2151.         break;
  2152.     case rtfACForeColor:
  2153.         break;
  2154.     case rtfACSubScript:
  2155.         break;
  2156.     case rtfACExpand:
  2157.         break;
  2158.     case rtfACFontNum:
  2159.         break;
  2160.     case rtfACFontSize:
  2161.         break;
  2162.     case rtfACItalic:
  2163.         break;
  2164.     case rtfACLanguage:
  2165.         break;
  2166.     case rtfACOutline:
  2167.         break;
  2168.     case rtfACSmallCaps:
  2169.         break;
  2170.     case rtfACShadow:
  2171.         break;
  2172.     case rtfACStrikeThru:
  2173.         break;
  2174.     case rtfACUnderline:
  2175.         break;
  2176.     case rtfACDotUnderline:
  2177.         break;
  2178.     case rtfACDbUnderline:
  2179.         break;
  2180.     case rtfACNoUnderline:
  2181.         break;
  2182.     case rtfACWordUnderline:
  2183.         break;
  2184.     case rtfACSuperScript:
  2185.         break;
  2186.     }
  2187. }
  2188.  
  2189.  
  2190. void DRTFprocess::FontAttr()
  2191. {
  2192.     switch (fMinor)
  2193.     {
  2194.     case rtfFontCharSet:
  2195.         break;
  2196.     case rtfFontPitch:
  2197.         break;
  2198.     case rtfFontCodePage:
  2199.         break;
  2200.     case rtfFTypeNil:
  2201.         break;
  2202.     case rtfFTypeTrueType:
  2203.         break;
  2204.     }
  2205. }
  2206.  
  2207.  
  2208. void DRTFprocess::FileAttr()
  2209. {
  2210.     switch (fMinor)
  2211.     {
  2212.     case rtfFileNum:
  2213.         break;
  2214.     case rtfFileRelPath:
  2215.         break;
  2216.     case rtfFileOSNum:
  2217.         break;
  2218.     }
  2219. }
  2220.  
  2221.  
  2222. void DRTFprocess::FileSource()
  2223. {
  2224.     switch (fMinor)
  2225.     {
  2226.     case rtfSrcMacintosh:
  2227.         break;
  2228.     case rtfSrcDOS:
  2229.         break;
  2230.     case rtfSrcNTFS:
  2231.         break;
  2232.     case rtfSrcHPFS:
  2233.         break;
  2234.     case rtfSrcNetwork:
  2235.         break;
  2236.     }
  2237. }
  2238.  
  2239.  
  2240. void DRTFprocess::DrawAttr()
  2241. {
  2242.     switch (fMinor)
  2243.     {
  2244.     case rtfDrawLock:
  2245.         break;
  2246.     case rtfDrawPageRelX:
  2247.         break;
  2248.     case rtfDrawColumnRelX:
  2249.         break;
  2250.     case rtfDrawMarginRelX:
  2251.         break;
  2252.     case rtfDrawPageRelY:
  2253.         break;
  2254.     case rtfDrawColumnRelY:
  2255.         break;
  2256.     case rtfDrawMarginRelY:
  2257.         break;
  2258.     case rtfDrawHeight:
  2259.         break;
  2260.     case rtfDrawBeginGroup:
  2261.         break;
  2262.     case rtfDrawGroupCount:
  2263.         break;
  2264.     case rtfDrawEndGroup:
  2265.         break;
  2266.     case rtfDrawArc:
  2267.         break;
  2268.     case rtfDrawCallout:
  2269.         break;
  2270.     case rtfDrawEllipse:
  2271.         break;
  2272.     case rtfDrawLine:
  2273.         break;
  2274.     case rtfDrawPolygon:
  2275.         break;
  2276.     case rtfDrawPolyLine:
  2277.         break;
  2278.     case rtfDrawRect:
  2279.         break;
  2280.     case rtfDrawTextBox:
  2281.         break;
  2282.     case rtfDrawOffsetX:
  2283.         break;
  2284.     case rtfDrawSizeX:
  2285.         break;
  2286.     case rtfDrawOffsetY:
  2287.         break;
  2288.     case rtfDrawSizeY:
  2289.         break;
  2290.     case rtfCOAngle:
  2291.         break;
  2292.     case rtfCOAccentBar:
  2293.         break;
  2294.     case rtfCOBestFit:
  2295.         break;
  2296.     case rtfCOBorder:
  2297.         break;
  2298.     case rtfCOAttachAbsDist:
  2299.         break;
  2300.     case rtfCOAttachBottom:
  2301.         break;
  2302.     case rtfCOAttachCenter:
  2303.         break;
  2304.     case rtfCOAttachTop:
  2305.         break;
  2306.     case rtfCOLength:
  2307.         break;
  2308.     case rtfCONegXQuadrant:
  2309.         break;
  2310.     case rtfCONegYQuadrant:
  2311.         break;
  2312.     case rtfCOOffset:
  2313.         break;
  2314.     case rtfCOAttachSmart:
  2315.         break;
  2316.     case rtfCODoubleLine:
  2317.         break;
  2318.     case rtfCORightAngle:
  2319.         break;
  2320.     case rtfCOSingleLine:
  2321.         break;
  2322.     case rtfCOTripleLine:
  2323.         break;
  2324.     case rtfDrawTextBoxMargin:
  2325.         break;
  2326.     case rtfDrawTextBoxText:
  2327.         break;
  2328.     case rtfDrawRoundRect:
  2329.         break;
  2330.     case rtfDrawPointX:
  2331.         break;
  2332.     case rtfDrawPointY:
  2333.         break;
  2334.     case rtfDrawPolyCount:
  2335.         break;
  2336.     case rtfDrawArcFlipX:
  2337.         break;
  2338.     case rtfDrawArcFlipY:
  2339.         break;
  2340.     case rtfDrawLineBlue:
  2341.         break;
  2342.     case rtfDrawLineGreen:
  2343.         break;
  2344.     case rtfDrawLineRed:
  2345.         break;
  2346.     case rtfDrawLinePalette:
  2347.         break;
  2348.     case rtfDrawLineDashDot:
  2349.         break;
  2350.     case rtfDrawLineDashDotDot:
  2351.         break;
  2352.     case rtfDrawLineDash:
  2353.         break;
  2354.     case rtfDrawLineDot:
  2355.         break;
  2356.     case rtfDrawLineGray:
  2357.         break;
  2358.     case rtfDrawLineHollow:
  2359.         break;
  2360.     case rtfDrawLineSolid:
  2361.         break;
  2362.     case rtfDrawLineWidth:
  2363.         break;
  2364.     case rtfDrawHollowEndArrow:
  2365.         break;
  2366.     case rtfDrawEndArrowLength:
  2367.         break;
  2368.     case rtfDrawSolidEndArrow:
  2369.         break;
  2370.     case rtfDrawEndArrowWidth:
  2371.         break;
  2372.     case rtfDrawHollowStartArrow:
  2373.         break;
  2374.     case rtfDrawStartArrowLength:
  2375.         break;
  2376.     case rtfDrawSolidStartArrow:
  2377.         break;
  2378.     case rtfDrawStartArrowWidth:
  2379.         break;
  2380.     case rtfDrawBgFillBlue:
  2381.         break;
  2382.     case rtfDrawBgFillGreen:
  2383.         break;
  2384.     case rtfDrawBgFillRed:
  2385.         break;
  2386.     case rtfDrawBgFillPalette:
  2387.         break;
  2388.     case rtfDrawBgFillGray:
  2389.         break;
  2390.     case rtfDrawFgFillBlue:
  2391.         break;
  2392.     case rtfDrawFgFillGreen:
  2393.         break;
  2394.     case rtfDrawFgFillRed:
  2395.         break;
  2396.     case rtfDrawFgFillPalette:
  2397.         break;
  2398.     case rtfDrawFgFillGray:
  2399.         break;
  2400.     case rtfDrawFillPatIndex:
  2401.         break;
  2402.     case rtfDrawShadow:
  2403.         break;
  2404.     case rtfDrawShadowXOffset:
  2405.         break;
  2406.     case rtfDrawShadowYOffset:
  2407.         break;
  2408.     }
  2409. }
  2410.  
  2411.  
  2412. void DRTFprocess::IndexAttr()
  2413. {
  2414.     switch (fMinor)
  2415.     {
  2416.     case rtfIndexNumber:
  2417.         break;
  2418.     case rtfIndexBold:
  2419.         break;
  2420.     case rtfIndexItalic:
  2421.         break;
  2422.     }
  2423. }
  2424.  
  2425.  
  2426. void DRTFprocess::SelectLanguage()
  2427. {
  2428.     switch (fParam)
  2429.     {
  2430.     case rtfLangNoLang:
  2431.         break;
  2432.     case rtfLangAlbanian:
  2433.         break;
  2434.     case rtfLangArabic:
  2435.         break;
  2436.     case rtfLangBahasa:
  2437.         break;
  2438.     case rtfLangBelgianDutch:
  2439.         break;
  2440.     case rtfLangBelgianFrench:
  2441.         break;
  2442.     case rtfLangBrazilianPortuguese:
  2443.         break;
  2444.     case rtfLangBulgarian:
  2445.         break;
  2446.     case rtfLangCatalan:
  2447.         break;
  2448.     case rtfLangLatinCroatoSerbian:
  2449.         break;
  2450.     case rtfLangCzech:
  2451.         break;
  2452.     case rtfLangDanish:
  2453.         break;
  2454.     case rtfLangDutch:
  2455.         break;
  2456.     case rtfLangAustralianEnglish:
  2457.         break;
  2458.     case rtfLangUKEnglish:
  2459.         break;
  2460.     case rtfLangUSEnglish:
  2461.         break;
  2462.     case rtfLangFinnish:
  2463.         break;
  2464.     case rtfLangFrench:
  2465.         break;
  2466.     case rtfLangCanadianFrench:
  2467.         break;
  2468.     case rtfLangGerman:
  2469.         break;
  2470.     case rtfLangGreek:
  2471.         break;
  2472.     case rtfLangHebrew:
  2473.         break;
  2474.     case rtfLangHungarian:
  2475.         break;
  2476.     case rtfLangIcelandic:
  2477.         break;
  2478.     case rtfLangItalian:
  2479.         break;
  2480.     case rtfLangJapanese:
  2481.         break;
  2482.     case rtfLangKorean:
  2483.         break;
  2484.     case rtfLangBokmalNorwegian:
  2485.         break;
  2486.     case rtfLangNynorskNorwegian:
  2487.         break;
  2488.     case rtfLangPolish:
  2489.         break;
  2490.     case rtfLangPortuguese:
  2491.         break;
  2492.     case rtfLangRhaetoRomanic:
  2493.         break;
  2494.     case rtfLangRomanian:
  2495.         break;
  2496.     case rtfLangRussian:
  2497.         break;
  2498.     case rtfLangCyrillicSerboCroatian:
  2499.         break;
  2500.     case rtfLangSimplifiedChinese:
  2501.         break;
  2502.     case rtfLangSlovak:
  2503.         break;
  2504.     case rtfLangCastilianSpanish:
  2505.         break;
  2506.     case rtfLangMexicanSpanish:
  2507.         break;
  2508.     case rtfLangSwedish:
  2509.         break;
  2510.     case rtfLangSwissFrench:
  2511.         break;
  2512.     case rtfLangSwissGerman:
  2513.         break;
  2514.     case rtfLangSwissItalian:
  2515.         break;
  2516.     case rtfLangThai:
  2517.         break;
  2518.     case rtfLangTraditionalChinese:
  2519.         break;
  2520.     case rtfLangTurkish:
  2521.         break;
  2522.     case rtfLangUrdu:
  2523.         break;
  2524.     }
  2525. }
  2526.  
  2527.